/*
* FaceCat的Flutter框架
* 上海卷卷猫信息技术有限公司
*/

import 'package:flutter/material.dart';
import 'dart:math';
import 'dart:async';
import 'facecat.dart';

/*
* 触摸开始方法
* view:视图
* firstTouch:是否第一次触摸
* firstPoint:第一次触摸的坐标
* secondTouch:是否第二次触摸
* secondPoint:第二次触摸的坐标
*/
void onTouchBegin(FCView view, bool firstTouch, FCPoint firstPoint,
    bool secondTouch, FCPoint secondPoint) {
  if (view.viewType == "chart") {
    FCChart chart = tChart;
    if (chart.addingPlotChart.isNotEmpty) {
      addPlotDefault(chart, firstTouch, firstPoint, secondTouch, secondPoint);
      chart.addingPlotChart = "";
      invalidateView(view.getParent());
    } else {
      touchDownChart(chart, firstTouch, firstPoint, secondTouch, secondPoint);
      invalidateView(view.getParent());
    }
  }else{
    onTouchBeginDefault(view, firstTouch, firstPoint, secondTouch, secondPoint);
  }
}

/*
* 触摸移动方法
* view:视图
* firstTouch:是否第一次触摸
* firstPoint:第一次触摸的坐标
* secondTouch:是否第二次触摸
* secondPoint:第二次触摸的坐标
*/
void onTouchMove(FCView view, bool firstTouch, FCPoint firstPoint,
    bool secondTouch, FCPoint secondPoint) {
  onTouchMoveDefault(view, firstTouch, firstPoint, secondTouch, secondPoint);
}

/*
* 触摸结束方法
* view:视图
* firstTouch:是否第一次触摸
* firstPoint:第一次触摸的坐标
* secondTouch:是否第二次触摸
* secondPoint:第二次触摸的坐标
*/
void onTouchEnd(FCView view, bool firstTouch, FCPoint firstPoint,
    bool secondTouch, FCPoint secondPoint) {
  onTouchEndDefault(view, firstTouch, firstPoint, secondTouch, secondPoint);
}


/*
* 点击实现方法
* view:视图
* firstTouch:是否第一次触摸
* firstPoint:第一次触摸的坐标
* secondTouch:是否第二次触摸
* secondPoint:第二次触摸的坐标
* clicks 点击次数
*/
void onClick(FCView view, bool firstTouch, FCPoint firstPoint,
    bool secondTouch, FCPoint secondPoint, int clicks) {
  onClickDefault(view, firstTouch, firstPoint, secondTouch, secondPoint, clicks);
  if (view.viewName == "Indicator") {
    if (view.text == "BOLL" || view.text == "MA") {
      tChart.mainIndicator = view.text;
    } else {
      tChart.showIndicator = view.text;
    }
    calcChartIndicator(tChart);
    FCTabView tabView = view.getParent().getParent().getParent() as FCTabView;
    selectTabPage(tabView, tabView.tabPages[0]);
    invalidateView(view.getParent());
  } else if (view.viewName == "Plot") {
    tChart.addingPlotChart = view.text;
    FCTabView tabView = view.getParent().getParent().getParent() as FCTabView;
    selectTabPage(tabView, tabView.tabPages[0]);
    invalidateView(view.getParent());
  }
}

/*
* 重绘背景的实现方法
* view:视图
* paint:绘图对象
* clipRect:裁剪区域
*/
void onPaint(FCView view, FCPaint paint, FCRect clipRect) {
  onPaintDefault(view, paint, clipRect);
}

/*
* 重绘边框的实现方法
* view:视图
* paint:绘图对象
* clipRect:裁剪区域
*/
void onPaintBorder(FCView view, FCPaint paint, FCRect clipRect) {
  onPaintBorderDefault(view, paint, clipRect);
}

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: FaceCatPage()
  ));
}

class FaceCatPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => MyApp();
}

FCPaint appPaint = FCPaint();
bool isInit = false;
FCChart tChart = FCChart();

class MyApp extends State<FaceCatPage>{
  Map<int, Offset> touchPositions = {};
  late TextField textField;
  FCTextBox editingTextBox = FCTextBox();
  Color editBackColor = Color.fromARGB(0, 0, 0, 0);
  Color editTextColor = Color.fromARGB(0, 0, 0, 0);
  String editFontFamily = "Arial";
  double editFontSize = 14;
  double textBoxLeft = 0;
  double textBoxTop = 0;
  double textBoxWidth = 0;
  double textBoxHeight = 0;
  bool _isTapped = false;
  TextEditingController _textController = TextEditingController();
  FocusNode _focusNode = FocusNode();
  @override
  Widget build(BuildContext context) {
    bool initThis = isInit;
    init();
    if (!initThis) {
      Timer.periodic(const Duration(milliseconds: 20), (timer) {
        updateScrollCount = 0;
        updateScroll(appPaint.views);
        if (updateScrollCount > 0) {
          setState(() {
          _isTapped = !_isTapped;
        });
        }
      });
    }
    return Scaffold(
      body: Stack(
        children: [
          Listener(
            onPointerDown: (event) {
              touchPositions[event.pointer] = event.localPosition;
              FCView lastFocusedView = appPaint.getFocusedView();
              doPointerDown(event, touchPositions, appPaint);
              FCView focusedView = appPaint.getFocusedView();
              if(focusedView.isNotEmpty && focusedView.viewType == "textbox"){
                if(lastFocusedView != focusedView && lastFocusedView.isNotEmpty && lastFocusedView.viewType == "textbox"){
                  lastFocusedView.text = _textController.text;
                }
                editingTextBox = focusedView as FCTextBox;
                double scaleFactorX = appPaint.scaleFactorX;
                double scaleFactorY = appPaint.scaleFactorY;
                double clx = clientX(editingTextBox);
                double cly = clientY(editingTextBox);
                textBoxLeft = (clx * scaleFactorX) + 1;
                textBoxTop = (cly * scaleFactorY) + 1;
                textBoxWidth = (editingTextBox.size.cx - 2) * scaleFactorX;
                textBoxHeight = (editingTextBox.size.cy - 2) * scaleFactorY;
                editBackColor = stringToColor(editingTextBox.backColor);
                editTextColor = stringToColor(editingTextBox.textColor);
                _textController.text = editingTextBox.text;
                  List<String> strs = editingTextBox.font.split(",");
                String fontFamily = strs[0];
                if(fontFamily == "Default"){
                  fontFamily = appPaint.systemFont;
                }
                editFontFamily = fontFamily;
                editFontSize = min(appPaint.scaleFactorX, appPaint.scaleFactorY) * double.parse(strs[1]);
                WidgetsBinding.instance.addPostFrameCallback((_){
                  FocusScope.of(context).requestFocus(_focusNode);
                });
              }else{
                if(editingTextBox.isNotEmpty){
                  editingTextBox.text = _textController.text;
                  editingTextBox = FCTextBox();
                  editingTextBox.isNotEmpty = false;
                  textBoxLeft = 0;
                  textBoxTop = 0;
                  textBoxWidth = 0;
                  textBoxHeight = 0;
                }
              }
              setState(() {
                _isTapped = !_isTapped;
              });
            },
            onPointerMove: (event) {
              touchPositions[event.pointer] = event.localPosition;
              doPointerMove(event, touchPositions, appPaint);
              setState(() {
                _isTapped = !_isTapped;
              });
            },
            onPointerUp: (event) {
              doPointerUp(event, touchPositions, appPaint);
              touchPositions.remove(event.pointer);
              setState(() {
                _isTapped = !_isTapped;
              });
            },
            child:
              CustomPaint(
                size:Size.infinite,
                painter:MyPainter(_isTapped)
              ),
          ),
          Positioned(
            top: textBoxTop,
            left: textBoxLeft,
            child: Container(
              width: textBoxWidth,
              height: textBoxHeight,
              child: TextField(
                decoration:InputDecoration
                (
                  border:InputBorder.none,
                  filled:true,
                  fillColor:editBackColor
                ),
                style:TextStyle(color:editTextColor, fontFamily:editFontFamily, fontSize: editFontSize),
                controller:_textController,
                focusNode:_focusNode
              ),
            ),
          ),
        ],
      ),
    );
  }

  List<SecurityData> getSecurityDatas() {
    List<SecurityData> securityDatas = <SecurityData>[];
    SecurityData sData1 = SecurityData();
    sData1.volume = 78469.756458;
    sData1.close = 15684.25;
    sData1.high = 15965.01;
    sData1.low = 15272.69;
    sData1.open = 15297.22;
    sData1.date = 1605052800.0;
    securityDatas.add(sData1);
    SecurityData sData2 = SecurityData();
    sData2.volume = 102196.366592;
    sData2.close = 16291.87;
    sData2.high = 16340.71;
    sData2.low = 15440.65;
    sData2.open = 15684.26;
    sData2.date = 1605139200.0;
    securityDatas.add(sData2);
    SecurityData sData3 = SecurityData();
    sData3.volume = 75691.891014;
    sData3.close = 16320.71;
    sData3.high = 16480.01;
    sData3.low = 15952.36;
    sData3.open = 16291.86;
    sData3.date = 1605225600.0;
    securityDatas.add(sData3);
    SecurityData sData4 = SecurityData();
    sData4.volume = 59116.357179;
    sData4.close = 16070.46;
    sData4.high = 16327.0;
    sData4.low = 15670.01;
    sData4.open = 16320.05;
    sData4.date = 1605312000.0;
    securityDatas.add(sData4);
    SecurityData sData5 = SecurityData();
    sData5.volume = 43596.851513;
    sData5.close = 15957.01;
    sData5.high = 16180.01;
    sData5.low = 15774.73;
    sData5.open = 16069.57;
    sData5.date = 1605398400.0;
    securityDatas.add(sData5);
    SecurityData sData6 = SecurityData();
    sData6.volume = 81300.685924;
    sData6.close = 16713.58;
    sData6.high = 16880.01;
    sData6.low = 15864.01;
    sData6.open = 15957.01;
    sData6.date = 1605484800.0;
    securityDatas.add(sData6);
    SecurityData sData7 = SecurityData();
    sData7.volume = 115192.02613;
    sData7.close = 17659.39;
    sData7.high = 17858.83;
    sData7.low = 16538.01;
    sData7.open = 16713.09;
    sData7.date = 1605571200.0;
    securityDatas.add(sData7);
    SecurityData sData8 = SecurityData();
    sData8.volume = 141984.264415;
    sData8.close = 17776.13;
    sData8.high = 18476.94;
    sData8.low = 17222.01;
    sData8.open = 17659.39;
    sData8.date = 1605657600.0;
    securityDatas.add(sData8);
    SecurityData sData9 = SecurityData();
    sData9.volume = 93009.571008;
    sData9.close = 17802.83;
    sData9.high = 18179.81;
    sData9.low = 17335.66;
    sData9.open = 17777.76;
    sData9.date = 1605744000.0;
    securityDatas.add(sData9);
    SecurityData sData10 = SecurityData();
    sData10.volume = 88423.028489;
    sData10.close = 18655.68;
    sData10.high = 18815.23;
    sData10.low = 17740.05;
    sData10.open = 17802.82;
    sData10.date = 1605830400.0;
    securityDatas.add(sData10);
    SecurityData sData11 = SecurityData();
    sData11.volume = 71308.137138;
    sData11.close = 18703.81;
    sData11.high = 18965.91;
    sData11.low = 18308.59;
    sData11.open = 18655.67;
    sData11.date = 1605916800.0;
    securityDatas.add(sData11);
    SecurityData sData12 = SecurityData();
    sData12.volume = 74492.806006;
    sData12.close = 18414.61;
    sData12.high = 18750.01;
    sData12.low = 17699.8;
    sData12.open = 18703.81;
    sData12.date = 1606003200.0;
    securityDatas.add(sData12);
    SecurityData sData13 = SecurityData();
    sData13.volume = 74179.661546;
    sData13.close = 18368.01;
    sData13.high = 18766.01;
    sData13.low = 18000.01;
    sData13.open = 18413.89;
    sData13.date = 1606089600.0;
    securityDatas.add(sData13);
    SecurityData sData14 = SecurityData();
    sData14.volume = 70126.693681;
    sData14.close = 19160.02;
    sData14.high = 19410.0;
    sData14.low = 18207.99;
    sData14.open = 18368.02;
    sData14.date = 1606176000.0;
    securityDatas.add(sData14);
    SecurityData sData15 = SecurityData();
    sData15.volume = 70760.56353;
    sData15.close = 18719.12;
    sData15.high = 19444.01;
    sData15.low = 18570.01;
    sData15.open = 19160.01;
    sData15.date = 1606262400.0;
    securityDatas.add(sData15);
    SecurityData sData16 = SecurityData();
    sData16.volume = 102420.321403;
    sData16.close = 17149.48;
    sData16.high = 18915.04;
    sData16.low = 16188.01;
    sData16.open = 18718.84;
    sData16.date = 1606348800.0;
    securityDatas.add(sData16);
    SecurityData sData17 = SecurityData();
    sData17.volume = 84036.578341;
    sData17.close = 17139.53;
    sData17.high = 17457.63;
    sData17.low = 16438.09;
    sData17.open = 17149.48;
    sData17.date = 1606435200.0;
    securityDatas.add(sData17);
    SecurityData sData18 = SecurityData();
    sData18.volume = 60835.734083;
    sData18.close = 17719.86;
    sData18.high = 17880.5;
    sData18.low = 16865.57;
    sData18.open = 17139.54;
    sData18.date = 1606521600.0;
    securityDatas.add(sData18);
    SecurityData sData19 = SecurityData();
    sData19.volume = 55329.026303;
    sData19.close = 18185.0;
    sData19.high = 18360.06;
    sData19.low = 17517.01;
    sData19.open = 17719.85;
    sData19.date = 1606608000.0;
    securityDatas.add(sData19);
    SecurityData sData20 = SecurityData();
    sData20.volume = 96227.350495;
    sData20.close = 19695.88;
    sData20.high = 19777.04;
    sData20.low = 18185.0;
    sData20.open = 18185.01;
    sData20.date = 1606694400.0;
    securityDatas.add(sData20);
    SecurityData sData21 = SecurityData();
    sData21.volume = 100331.141203;
    sData21.close = 18764.97;
    sData21.high = 19888.01;
    sData21.low = 18350.0;
    sData21.open = 19695.88;
    sData21.date = 1606780800.0;
    securityDatas.add(sData21);
    SecurityData sData22 = SecurityData();
    sData22.volume = 75848.875728;
    sData22.close = 19204.1;
    sData22.high = 19342.01;
    sData22.low = 18330.01;
    sData22.open = 18764.97;
    sData22.date = 1606867200.0;
    securityDatas.add(sData22);
    SecurityData sData23 = SecurityData();
    sData23.volume = 64987.682732;
    sData23.close = 19421.91;
    sData23.high = 19598.01;
    sData23.low = 18867.21;
    sData23.open = 19204.09;
    sData23.date = 1606953600.0;
    securityDatas.add(sData23);
    SecurityData sData24 = SecurityData();
    sData24.volume = 65481.220724;
    sData24.close = 18650.53;
    sData24.high = 19527.01;
    sData24.low = 18565.32;
    sData24.open = 19422.35;
    sData24.date = 1607040000.0;
    securityDatas.add(sData24);
    SecurityData sData25 = SecurityData();
    sData25.volume = 42922.758573;
    sData25.close = 19147.67;
    sData25.high = 19177.01;
    sData25.low = 18500.01;
    sData25.open = 18650.52;
    sData25.date = 1607126400.0;
    securityDatas.add(sData25);
    SecurityData sData26 = SecurityData();
    sData26.volume = 37043.101861;
    sData26.close = 19359.41;
    sData26.high = 19420.01;
    sData26.low = 18857.01;
    sData26.open = 19147.67;
    sData26.date = 1607212800.0;
    securityDatas.add(sData26);
    SecurityData sData27 = SecurityData();
    sData27.volume = 40833.661907;
    sData27.close = 19166.91;
    sData27.high = 19420.92;
    sData27.low = 18902.89;
    sData27.open = 19358.68;
    sData27.date = 1607299200.0;
    securityDatas.add(sData27);
    SecurityData sData28 = SecurityData();
    sData28.volume = 56080.515386;
    sData28.close = 18324.12;
    sData28.high = 19294.85;
    sData28.low = 18200.01;
    sData28.open = 19166.91;
    sData28.date = 1607385600.0;
    securityDatas.add(sData28);
    SecurityData sData29 = SecurityData();
    sData29.volume = 75498.213856;
    sData29.close = 18541.29;
    sData29.high = 18639.58;
    sData29.low = 17650.01;
    sData29.open = 18324.12;
    sData29.date = 1607472000.0;
    securityDatas.add(sData29);
    SecurityData sData30 = SecurityData();
    sData30.volume = 52890.685094;
    sData30.close = 18254.64;
    sData30.high = 18557.33;
    sData30.low = 17911.13;
    sData30.open = 18541.3;
    sData30.date = 1607558400.0;
    securityDatas.add(sData30);
    SecurityData sData31 = SecurityData();
    sData31.volume = 72610.734259;
    sData31.close = 18036.54;
    sData31.high = 18292.74;
    sData31.low = 17572.34;
    sData31.open = 18254.82;
    sData31.date = 1607644800.0;
    securityDatas.add(sData31);
    SecurityData sData32 = SecurityData();
    sData32.volume = 47592.761572;
    sData32.close = 18808.7;
    sData32.high = 18948.67;
    sData32.low = 18020.71;
    sData32.open = 18036.54;
    sData32.date = 1607731200.0;
    securityDatas.add(sData32);
    SecurityData sData33 = SecurityData();
    sData33.volume = 56560.831744;
    sData33.close = 19175.0;
    sData33.high = 19411.01;
    sData33.low = 18711.13;
    sData33.open = 18808.7;
    sData33.date = 1607817600.0;
    securityDatas.add(sData33);
    SecurityData sData34 = SecurityData();
    sData34.volume = 47257.211294;
    sData34.close = 19273.15;
    sData34.high = 19349.01;
    sData34.low = 19000.01;
    sData34.open = 19175.0;
    sData34.date = 1607904000.0;
    securityDatas.add(sData34);
    SecurityData sData35 = SecurityData();
    sData35.volume = 61792.483421;
    sData35.close = 19426.44;
    sData35.high = 19570.01;
    sData35.low = 19050.01;
    sData35.open = 19273.7;
    sData35.date = 1607990400.0;
    securityDatas.add(sData35);
    SecurityData sData36 = SecurityData();
    sData36.volume = 97061.040854;
    sData36.close = 21335.53;
    sData36.high = 21560.01;
    sData36.low = 19278.61;
    sData36.open = 19426.44;
    sData36.date = 1608076800.0;
    securityDatas.add(sData36);
    SecurityData sData37 = SecurityData();
    sData37.volume = 148769.444419;
    sData37.close = 22808.99;
    sData37.high = 23699.71;
    sData37.low = 21233.01;
    sData37.open = 21335.53;
    sData37.date = 1608163200.0;
    securityDatas.add(sData37);
    SecurityData sData38 = SecurityData();
    sData38.volume = 79646.144315;
    sData38.close = 23107.4;
    sData38.high = 23285.19;
    sData38.low = 22350.01;
    sData38.open = 22797.16;
    sData38.date = 1608249600.0;
    securityDatas.add(sData38);
    SecurityData sData39 = SecurityData();
    sData39.volume = 82430.712232;
    sData39.close = 23821.62;
    sData39.high = 24171.48;
    sData39.low = 22750.01;
    sData39.open = 23107.4;
    sData39.date = 1608336000.0;
    securityDatas.add(sData39);
    SecurityData sData40 = SecurityData();
    sData40.volume = 74797.201958;
    sData40.close = 23455.53;
    sData40.high = 24295.01;
    sData40.low = 23060.01;
    sData40.open = 23821.61;
    sData40.date = 1608422400.0;
    securityDatas.add(sData40);
    SecurityData sData41 = SecurityData();
    sData41.volume = 83424.441428;
    sData41.close = 22719.72;
    sData41.high = 24102.78;
    sData41.low = 21815.01;
    sData41.open = 23455.55;
    sData41.date = 1608508800.0;
    securityDatas.add(sData41);
    SecurityData sData42 = SecurityData();
    sData42.volume = 87033.13616;
    sData42.close = 23810.8;
    sData42.high = 23837.11;
    sData42.low = 22353.41;
    sData42.open = 22719.89;
    sData42.date = 1608595200.0;
    securityDatas.add(sData42);
    SecurityData sData43 = SecurityData();
    sData43.volume = 112830.021287;
    sData43.close = 23232.77;
    sData43.high = 24100.01;
    sData43.low = 22810.01;
    sData43.open = 23810.8;
    sData43.date = 1608681600.0;
    securityDatas.add(sData43);
    SecurityData sData44 = SecurityData();
    sData44.volume = 69013.844252;
    sData44.close = 23729.21;
    sData44.high = 23794.44;
    sData44.low = 22703.43;
    sData44.open = 23232.4;
    sData44.date = 1608768000.0;
    securityDatas.add(sData44);
    SecurityData sData45 = SecurityData();
    sData45.volume = 78024.251646;
    sData45.close = 24712.48;
    sData45.high = 24789.87;
    sData45.low = 23434.74;
    sData45.open = 23729.0;
    sData45.date = 1608854400.0;
    securityDatas.add(sData45);
    SecurityData sData46 = SecurityData();
    sData46.volume = 97806.523386;
    sData46.close = 26493.4;
    sData46.high = 26867.04;
    sData46.low = 24500.01;
    sData46.open = 24712.48;
    sData46.date = 1608940800.0;
    securityDatas.add(sData46);
    SecurityData sData47 = SecurityData();
    sData47.volume = 145880.8092;
    sData47.close = 26281.67;
    sData47.high = 28422.01;
    sData47.low = 25700.01;
    sData47.open = 26493.41;
    sData47.date = 1609027200.0;
    securityDatas.add(sData47);
    SecurityData sData48 = SecurityData();
    sData48.volume = 79408.740817;
    sData48.close = 27079.42;
    sData48.high = 27500.01;
    sData48.low = 26101.01;
    sData48.open = 26281.55;
    sData48.date = 1609113600.0;
    securityDatas.add(sData48);
    SecurityData sData49 = SecurityData();
    sData49.volume = 69255.341092;
    sData49.close = 27385.01;
    sData49.high = 27410.01;
    sData49.low = 25880.01;
    sData49.open = 27079.43;
    sData49.date = 1609200000.0;
    securityDatas.add(sData49);
    SecurityData sData50 = SecurityData();
    sData50.volume = 95356.067826;
    sData50.close = 28875.55;
    sData50.high = 28996.01;
    sData50.low = 27320.01;
    sData50.open = 27385.01;
    sData50.date = 1609286400.0;
    securityDatas.add(sData50);
    SecurityData sData51 = SecurityData();
    sData51.volume = 75491.419522;
    sData51.close = 28923.64;
    sData51.high = 29300.01;
    sData51.low = 27850.01;
    sData51.open = 28875.56;
    sData51.date = 1609372800.0;
    securityDatas.add(sData51);
    SecurityData sData52 = SecurityData();
    sData52.volume = 54134.113624;
    sData52.close = 29331.7;
    sData52.high = 29600.01;
    sData52.low = 28624.58;
    sData52.open = 28923.64;
    sData52.date = 1609459200.0;
    securityDatas.add(sData52);
    SecurityData sData53 = SecurityData();
    sData53.volume = 126100.088124;
    sData53.close = 32178.34;
    sData53.high = 33300.01;
    sData53.low = 28946.54;
    sData53.open = 29331.71;
    sData53.date = 1609545600.0;
    securityDatas.add(sData53);
    SecurityData sData54 = SecurityData();
    sData54.volume = 110771.806254;
    sData54.close = 33000.06;
    sData54.high = 34778.12;
    sData54.low = 31963.0;
    sData54.open = 32176.46;
    sData54.date = 1609632000.0;
    securityDatas.add(sData54);
    SecurityData sData55 = SecurityData();
    sData55.volume = 121030.155465;
    sData55.close = 31988.72;
    sData55.high = 33600.01;
    sData55.low = 28130.01;
    sData55.open = 33000.06;
    sData55.date = 1609718400.0;
    securityDatas.add(sData55);
    SecurityData sData56 = SecurityData();
    sData56.volume = 111890.475678;
    sData56.close = 33949.54;
    sData56.high = 34360.01;
    sData56.low = 29900.01;
    sData56.open = 31989.76;
    sData56.date = 1609804800.0;
    securityDatas.add(sData56);
    SecurityData sData57 = SecurityData();
    sData57.volume = 116093.037717;
    sData57.close = 36769.37;
    sData57.high = 36939.22;
    sData57.low = 33288.01;
    sData57.open = 33949.54;
    sData57.date = 1609891200.0;
    securityDatas.add(sData57);
    SecurityData sData58 = SecurityData();
    sData58.volume = 121506.449096;
    sData58.close = 39432.29;
    sData58.high = 40365.01;
    sData58.low = 36300.01;
    sData58.open = 36769.37;
    sData58.date = 1609977600.0;
    securityDatas.add(sData58);
    SecurityData sData59 = SecurityData();
    sData59.volume = 138625.042444;
    sData59.close = 40582.82;
    sData59.high = 41950.01;
    sData59.low = 36500.01;
    sData59.open = 39432.49;
    sData59.date = 1610064000.0;
    securityDatas.add(sData59);
    SecurityData sData60 = SecurityData();
    sData60.volume = 75785.989675;
    sData60.close = 40088.23;
    sData60.high = 41380.01;
    sData60.low = 38720.01;
    sData60.open = 40586.97;
    sData60.date = 1610150400.0;
    securityDatas.add(sData60);
    SecurityData sData61 = SecurityData();
    sData61.volume = 112638.990321;
    sData61.close = 38150.03;
    sData61.high = 41350.01;
    sData61.low = 35111.12;
    sData61.open = 40088.23;
    sData61.date = 1610236800.0;
    securityDatas.add(sData61);
    SecurityData sData62 = SecurityData();
    sData62.volume = 231175.583454;
    sData62.close = 35404.48;
    sData62.high = 38264.75;
    sData62.low = 30420.01;
    sData62.open = 38150.03;
    sData62.date = 1610323200.0;
    securityDatas.add(sData62);
    SecurityData sData63 = SecurityData();
    sData63.volume = 133948.161996;
    sData63.close = 34051.25;
    sData63.high = 36628.01;
    sData63.low = 32531.01;
    sData63.open = 35410.38;
    sData63.date = 1610409600.0;
    securityDatas.add(sData63);
    SecurityData sData64 = SecurityData();
    sData64.volume = 124477.924938;
    sData64.close = 37371.39;
    sData64.high = 37850.01;
    sData64.low = 32380.01;
    sData64.open = 34049.16;
    sData64.date = 1610496000.0;
    securityDatas.add(sData64);
    SecurityData sData65 = SecurityData();
    sData65.volume = 102950.399421;
    sData65.close = 39144.51;
    sData65.high = 40100.01;
    sData65.low = 36701.24;
    sData65.open = 37371.39;
    sData65.date = 1610582400.0;
    securityDatas.add(sData65);
    SecurityData sData66 = SecurityData();
    sData66.volume = 111365.804668;
    sData66.close = 36742.23;
    sData66.high = 39747.77;
    sData66.low = 34538.89;
    sData66.open = 39145.22;
    sData66.date = 1610668800.0;
    securityDatas.add(sData66);
    SecurityData sData67 = SecurityData();
    sData67.volume = 86348.441508;
    sData67.close = 35994.99;
    sData67.high = 37950.01;
    sData67.low = 35357.81;
    sData67.open = 36737.44;
    sData67.date = 1610755200.0;
    securityDatas.add(sData67);
    SecurityData sData68 = SecurityData();
    sData68.volume = 80157.737384;
    sData68.close = 35828.62;
    sData68.high = 36852.51;
    sData68.low = 33850.01;
    sData68.open = 35994.99;
    sData68.date = 1610841600.0;
    securityDatas.add(sData68);
    SecurityData sData69 = SecurityData();
    sData69.volume = 70693.90404;
    sData69.close = 36631.28;
    sData69.high = 37469.84;
    sData69.low = 34800.01;
    sData69.open = 35825.0;
    sData69.date = 1610928000.0;
    securityDatas.add(sData69);
    SecurityData sData70 = SecurityData();
    sData70.volume = 79596.541309;
    sData70.close = 35891.5;
    sData70.high = 37850.01;
    sData70.low = 35844.07;
    sData70.open = 36622.47;
    sData70.date = 1611014400.0;
    securityDatas.add(sData70);
    SecurityData sData71 = SecurityData();
    sData71.volume = 89368.432918;
    sData71.close = 35468.24;
    sData71.high = 36415.32;
    sData71.low = 33400.01;
    sData71.open = 35901.95;
    sData71.date = 1611100800.0;
    securityDatas.add(sData71);
    SecurityData sData72 = SecurityData();
    sData72.volume = 134548.811336;
    sData72.close = 30850.14;
    sData72.high = 35600.01;
    sData72.low = 30071.01;
    sData72.open = 35468.24;
    sData72.date = 1611187200.0;
    securityDatas.add(sData72);
    SecurityData sData73 = SecurityData();
    sData73.volume = 138345.853436;
    sData73.close = 32945.18;
    sData73.high = 33826.54;
    sData73.low = 28850.01;
    sData73.open = 30852.0;
    sData73.date = 1611273600.0;
    securityDatas.add(sData73);
    SecurityData sData74 = SecurityData();
    sData74.volume = 64595.297675;
    sData74.close = 32078.01;
    sData74.high = 33456.01;
    sData74.low = 31390.17;
    sData74.open = 32950.01;
    sData74.date = 1611360000.0;
    securityDatas.add(sData74);
    SecurityData sData75 = SecurityData();
    sData75.volume = 57978.047966;
    sData75.close = 32259.91;
    sData75.high = 33071.01;
    sData75.low = 30900.01;
    sData75.open = 32078.01;
    sData75.date = 1611446400.0;
    securityDatas.add(sData75);
    SecurityData sData76 = SecurityData();
    sData76.volume = 88499.236921;
    sData76.close = 32254.21;
    sData76.high = 34875.01;
    sData76.low = 31910.01;
    sData76.open = 32259.46;
    sData76.date = 1611532800.0;
    securityDatas.add(sData76);
    SecurityData sData77 = SecurityData();
    sData77.volume = 84866.207055;
    sData77.close = 32467.78;
    sData77.high = 32921.89;
    sData77.low = 30837.38;
    sData77.open = 32254.2;
    sData77.date = 1611619200.0;
    securityDatas.add(sData77);
    SecurityData sData78 = SecurityData();
    sData78.volume = 95911.971711;
    sData78.close = 30366.16;
    sData78.high = 32557.3;
    sData78.low = 29241.73;
    sData78.open = 32464.02;
    sData78.date = 1611705600.0;
    securityDatas.add(sData78);
    SecurityData sData79 = SecurityData();
    sData79.volume = 92621.155617;
    sData79.close = 33364.87;
    sData79.high = 33783.99;
    sData79.low = 29842.11;
    sData79.open = 30362.2;
    sData79.date = 1611792000.0;
    securityDatas.add(sData79);
    SecurityData sData80 = SecurityData();
    sData80.volume = 193388.622446;
    sData80.close = 34252.21;
    sData80.high = 38531.91;
    sData80.low = 31915.41;
    sData80.open = 33368.19;
    sData80.date = 1611878400.0;
    securityDatas.add(sData80);
    SecurityData sData81 = SecurityData();
    sData81.volume = 82674.758249;
    sData81.close = 34262.89;
    sData81.high = 34933.01;
    sData81.low = 32825.01;
    sData81.open = 34246.29;
    sData81.date = 1611964800.0;
    securityDatas.add(sData81);
    SecurityData sData82 = SecurityData();
    sData82.volume = 66269.928016;
    sData82.close = 33092.99;
    sData82.high = 34342.7;
    sData82.low = 32171.68;
    sData82.open = 34262.9;
    sData82.date = 1612051200.0;
    securityDatas.add(sData82);
    SecurityData sData83 = SecurityData();
    sData83.volume = 80154.567802;
    sData83.close = 33526.38;
    sData83.high = 34717.28;
    sData83.low = 32296.17;
    sData83.open = 33089.45;
    sData83.date = 1612137600.0;
    securityDatas.add(sData83);
    SecurityData sData84 = SecurityData();
    sData84.volume = 78056.66988;
    sData84.close = 35466.25;
    sData84.high = 35984.34;
    sData84.low = 33418.01;
    sData84.open = 33517.1;
    sData84.date = 1612224000.0;
    securityDatas.add(sData84);
    SecurityData sData85 = SecurityData();
    sData85.volume = 80784.343663;
    sData85.close = 37618.88;
    sData85.high = 37662.64;
    sData85.low = 35362.39;
    sData85.open = 35472.72;
    sData85.date = 1612310400.0;
    securityDatas.add(sData85);
    SecurityData sData86 = SecurityData();
    sData86.volume = 89024.320756;
    sData86.close = 36936.67;
    sData86.high = 38708.28;
    sData86.low = 36161.96;
    sData86.open = 37620.27;
    sData86.date = 1612396800.0;
    securityDatas.add(sData86);
    SecurityData sData87 = SecurityData();
    sData87.volume = 65910.531514;
    sData87.close = 38290.25;
    sData87.high = 38310.13;
    sData87.low = 36570.01;
    sData87.open = 36936.66;
    sData87.date = 1612483200.0;
    securityDatas.add(sData87);
    SecurityData sData88 = SecurityData();
    sData88.volume = 94232.612846;
    sData88.close = 39186.95;
    sData88.high = 40955.52;
    sData88.low = 38215.95;
    sData88.open = 38289.33;
    sData88.date = 1612569600.0;
    securityDatas.add(sData88);
    SecurityData sData89 = SecurityData();
    sData89.volume = 81820.439177;
    sData89.close = 38795.7;
    sData89.high = 39700.01;
    sData89.low = 37351.01;
    sData89.open = 39181.02;
    sData89.date = 1612656000.0;
    securityDatas.add(sData89);
    SecurityData sData90 = SecurityData();
    sData90.volume = 121568.794672;
    sData90.close = 46374.88;
    sData90.high = 46794.46;
    sData90.low = 37988.9;
    sData90.open = 38795.7;
    sData90.date = 1612742400.0;
    securityDatas.add(sData90);
    SecurityData sData91 = SecurityData();
    sData91.volume = 114567.009318;
    sData91.close = 46420.43;
    sData91.high = 48142.2;
    sData91.low = 44961.1;
    sData91.open = 46374.87;
    sData91.date = 1612828800.0;
    securityDatas.add(sData91);
    SecurityData sData92 = SecurityData();
    sData92.volume = 78292.89657;
    sData92.close = 44807.59;
    sData92.high = 47310.01;
    sData92.low = 43800.01;
    sData92.open = 46420.43;
    sData92.date = 1612915200.0;
    securityDatas.add(sData92);
    SecurityData sData93 = SecurityData();
    sData93.volume = 81033.184776;
    sData93.close = 47969.52;
    sData93.high = 48678.91;
    sData93.low = 43994.03;
    sData93.open = 44807.59;
    sData93.date = 1613001600.0;
    securityDatas.add(sData93);
    SecurityData sData94 = SecurityData();
    sData94.volume = 81856.490636;
    sData94.close = 47287.61;
    sData94.high = 48985.81;
    sData94.low = 46400.01;
    sData94.open = 47968.67;
    sData94.date = 1613088000.0;
    securityDatas.add(sData94);
    SecurityData sData95 = SecurityData();
    sData95.volume = 58937.84066;
    sData95.close = 47153.7;
    sData95.high = 48150.01;
    sData95.low = 46202.54;
    sData95.open = 47298.16;
    sData95.date = 1613174400.0;
    securityDatas.add(sData95);
    SecurityData sData96 = SecurityData();
    sData96.volume = 70700.864117;
    sData96.close = 48577.8;
    sData96.high = 49707.44;
    sData96.low = 47014.18;
    sData96.open = 47156.79;
    sData96.date = 1613260800.0;
    securityDatas.add(sData96);
    SecurityData sData97 = SecurityData();
    sData97.volume = 63227.659425;
    sData97.close = 47911.11;
    sData97.high = 49010.93;
    sData97.low = 46174.79;
    sData97.open = 48580.48;
    sData97.date = 1613347200.0;
    securityDatas.add(sData97);
    SecurityData sData98 = SecurityData();
    sData98.volume = 78018.176005;
    sData98.close = 49133.46;
    sData98.high = 50080.22;
    sData98.low = 47003.63;
    sData98.open = 47911.11;
    sData98.date = 1613433600.0;
    securityDatas.add(sData98);
    SecurityData sData99 = SecurityData();
    sData99.volume = 84886.224046;
    sData99.close = 52119.72;
    sData99.high = 52618.75;
    sData99.low = 48947.01;
    sData99.open = 49133.46;
    sData99.date = 1613520000.0;
    securityDatas.add(sData99);
    SecurityData sData100 = SecurityData();
    sData100.volume = 58093.930825;
    sData100.close = 51552.61;
    sData100.high = 52530.01;
    sData100.low = 50901.91;
    sData100.open = 52117.68;
    sData100.date = 1613606400.0;
    securityDatas.add(sData100);
    return securityDatas;
  }

  void init() {
    if (!isInit) {
      isInit = true;
      editingTextBox.isNotEmpty = false;
      List<SecurityData> securityDatas = getSecurityDatas();
      appPaint.defaultUIStyle = "dark";
      appPaint.size = FCSize(800, 600);
      appPaint.addPaintEvent(onPaint);
      appPaint.addPaintBorderEvent(onPaintBorder);
      appPaint.addTouchBeginEvent(onTouchBegin);
      appPaint.addTouchMoveEvent(onTouchMove);
      appPaint.addTouchEndEvent(onTouchEnd);
      appPaint.addClickEvent(onClick);
      FCView noneView = FCView();
      noneView.isNotEmpty = false;
      String xml = """<?xml version="1.0" encoding="utf-8"?>
      <html xmlns="facecat">
        <head>
        </head>
        <body>
          <div dock="fill" type="tab" selectedindex="0" name="TabView">
            <div name="TabPage" text="View" type="tabpage">
              <chart size="200,200" name="Chart" text="Chart" location="212,164" dock="Fill">
              </chart>
            </div>
            <div name="TabPage2" text="Indicator" type="tabpage" />
            <div name="TabPage3" text="Plot" type="tabpage" />
          </div>
        </body>
      </html>
      """;
      renderFaceCat(appPaint, xml);
      FCChart chart = findViewByName("Chart", appPaint.views) as FCChart;
      chart.backColor = "rgb(0,0,0)";
      chart.textColor = "rgb(255,255,255)";
      chart.scaleColor = "rgb(100,100,100)";
      chart.crossTipColor = "rgb(50,50,50)";
      chart.crossLineColor = "rgb(100,100,100)";
      chart.gridColor = "rgba(100,100,100,125)";
      List<String> indicatorColors = <String>[];
      chart.indicatorColors = indicatorColors;
      indicatorColors.add("rgb(255,255,255)");
      indicatorColors.add("rgb(255,255,0)");
      indicatorColors.add("rgb(255,0,255)");
      indicatorColors.add("rgb(255,0,0)");
      indicatorColors.add("rgb(0,255,255)");
      indicatorColors.add("rgb(0,255,0)");
      indicatorColors.add("rgb(255,255,0)");
      indicatorColors.add("rgb(255,255,255)");
      tChart = chart;
      FCTabPage tabPage2 =
          findViewByName("TabPage2", appPaint.views) as FCTabPage;
      FCTabPage tabPage3 =
          findViewByName("TabPage3", appPaint.views) as FCTabPage;
      chart.rightVScaleWidth = 60;
      chart.data = securityDatas;
      chart.mainIndicator = "BOLL"; //主图指标
      chart.showIndicator = "MACD"; //显示指标
      resetChartVisibleRecord(chart);
      checkChartLastVisibleIndex(chart);
      calcChartIndicator(chart);
      FCLayoutDiv indLayout = FCLayoutDiv();
      indLayout.location = FCPoint(0, 0);
      indLayout.size = FCSize(tabPage2.size.cx, tabPage2.size.cy);
      indLayout.autoWrap = true;
      indLayout.backColor = "rgb(0,0,0)";
      addViewToParent(indLayout, tabPage2);
      List<String> indicators = <String>[];
      indicators.add("MA");
      indicators.add("BOLL");
      indicators.add("MACD");
      indicators.add("KDJ");
      indicators.add("BIAS");
      indicators.add("BBI");
      indicators.add("RSI");
      indicators.add("ROC");
      indicators.add("WR");
      indicators.add("DMA");
      indicators.add("TRIX");
      indicators.add("CCI");
      for (int i = 0; i < indicators.length; i++) {
        FCButton button = FCButton();
        button.text = indicators[i];
        button.viewName = "Indicator";
        button.size = FCSize(100, 50);
        button.margin = FCPadding(10, 10, 10, 10);
        button.backColor = "rgb(0,0,0)";
        button.textColor = "rgb(255,255,255)";
        addViewToParent(button, indLayout);
      }

      FCLayoutDiv indLayout2 = FCLayoutDiv();
      indLayout2.location = FCPoint(0, 0);
      indLayout2.size = FCSize(tabPage3.size.cx, tabPage3.size.cy);
      indLayout2.autoWrap = true;
      indLayout2.backColor = "rgb(0,0,0)";
      addViewToParent(indLayout2, tabPage3);

      List<String> plots = <String>[];
      plots.add("Line");
      plots.add("Segment");
      plots.add("Ray");
      plots.add("Triangle");
      plots.add("Rect");
      plots.add("Cycle");
      plots.add("CircumCycle");
      plots.add("Ellipse");
      plots.add("AngleLine");
      plots.add("LRLine");
      plots.add("LRChannel");
      plots.add("SymmetricTriangle");
      plots.add("LRBand");
      plots.add("ParalleGram");
      plots.add("SpeedResist");
      plots.add("FiboFanline");
      plots.add("FiboTimezone");
      plots.add("Percent");
      plots.add("BoxLine");
      plots.add("TironeLevels");
      plots.add("QuadrantLines");
      plots.add("Parallel");
      plots.add("GoldenRatio");
      plots.add("ArrowSegment");
      for (int i = 0; i < plots.length; i++) {
        FCButton button = FCButton();
        button.text = plots[i];
        button.viewName = "Plot";
        button.size = FCSize(100, 50);
        button.margin = FCPadding(10, 10, 10, 10);
        button.backColor = "rgb(0,0,0)";
        button.textColor = "rgb(255,255,255)";
        addViewToParent(button, indLayout2);
      }
      updateViewDefault(appPaint.views);
      invalidate(appPaint);
    }
  }
}

class MyPainter extends CustomPainter {
  final bool isTapped;

  MyPainter(this.isTapped);

  @override
  void paint(Canvas canvas, Size size) {
    onPaintCanvas(canvas, size, appPaint);
  }

  @override
  bool shouldRepaint(MyPainter oldDelegate) => isTapped != oldDelegate.isTapped;
}